/**
*  @file       xint.c
*  @brief      外部中断库函数
*  @author     Z B T
*  @version	   LTE
*  @date       2015-10
*/

#include "xint.h"

static unsigned char xint_flag[2] = {0, 0,};		/**< 外部中断标志 */

static void 		 set_xint_flag(enum XINT_N xint_x);
static unsigned char xint_inilize(enum XINT_N xint_x, struct XINT_INIT INTx);

/**
 *  @brief  外部中断0中断服务子程序
 *  @param  None
 *  @return None
 */

void int0_ISR(void) interrupt 0		
{
	set_xint_flag(xint_0);
}

/**
 *  @brief  外部中断1中断服务子程序
 *  @param  None
 *  @return None
 */
void int1_ISR(void) interrupt 2
{
	set_xint_flag(xint_1);
}

/**
 *  @brief  外部中断初始化配置函数
 *  @param  None
 *  @return None
 */
void xint_config(void)
{
	struct XINT_INIT INTx;

	INTx.intMode      = lowLevel;		/**< 低电平触发 */
	INTx.intPolity    = lowPolity;		/**< 低优先级 */
	INTx.intInterrupt = ENABLE;			/**< 中断使能 */
	xint_inilize(xint_0, INTx);			/**< 初始化外部中断0 */
}

/**
 *  @brief  读取外部中断标志
 *  @param  None
 *  @return 0未产生中断标志, 1产生中断标志后清零
 */
 unsigned char read_xint_flag(enum XINT_N xint_n)
 {
 	if (xint_flag[xint_n])
 	{
 		xint_flag[xint_n] = 0;
 		return 1;
 	}
 	else
 	{
 		return 0;
 	}

 }

/**
 *  @brief  外部中断标志
 *  @param  None
 *  @return None
 */
 static void set_xint_flag(enum XINT_N int_x)
 {
 	xint_flag[int_x] = 1;
 }



/**
 *  @brief  外部中断初始化函数
 *  @param  [in]int_n, [in]INTx
 *  @return None
 */
static unsigned char xint_inilize(enum XINT_N xint_n, struct XINT_INIT INTx)
{
	if (xint_n > xint_1)
	{
		return 1;
	}

	if (xint_n == xint_0)
	{
		if (INTx.intInterrupt == ENABLE)
		{
			EX0 = 1;
		}
		else
		{
			EX0 = 0;
		}
		if (INTx.intMode == fallEdge)
		{
			IT0 = 1;
		}
		else
		{
			IT0 = 0;
		}
		if (INTx.intPolity == highPolity)
		{
			PX0 = 1;
		}
		else
		{
			PX0 = 0;
		}
		return 0;
	}

	if (xint_n == xint_1)
	{
		if (INTx.intInterrupt == ENABLE)
		{
			EX1 = 1;
		}
		else
		{
			EX1 = 0;
		}
		if (INTx.intMode == fallEdge)
		{
			IT1 = 1;
		}
		else
		{
			IT1 = 0;
		}
		if (INTx.intPolity == highPolity)
		{
			PX1 = 1;
		}
		else
		{
			PX1 = 0;
		}
		return 0;
	}
	return 2;
}
